Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
| Symbol | Value |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
使用羅馬數字來表示整數,例如:7 >> V(5)+II(2) >> VII27 >> XX(20)+V(5)+II(2) >> XXVI
若遇到4跟9這兩種數字,表示法會不一樣。4不會是IIII,而是IV,相當於5-1的意思,9不會是VIIII,而是IX,相當於10-1的意思,
以此類推,40 >> XL,90 >> XC。
輸入的範圍介於1 to 3999。
Input: 3
Output: III
Input: 4
Output: IV
Input: 9
Output: IX
Input: 58
Output: LVIII
每個符號代表一個數值,這樣的概念類似於另一個經典的練習題:收銀機,找錢時,需要500元幾張,100元幾張,50元幾枚...。
所以我們可以將這些符號當作幣值:
let val = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
let roman = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
假設輸入的參數num=3999。
需要MMM(3000)+CM(900)+XC(90)+IX(9)=MMMCMXCIX。
符號重複次數 = num / 符號的值 ,取商數。
count = parseInt(num / val[i]);
剩下的數值 = num / 符號的值,取餘數。
num = num % val[i];
重複符號該如何串接?
可以使用String API repeat()。
例如M要重複3次:
roman[0].repeat(3);
第一次算出的結果為MMM,接著取餘數(999),再次運算。
這邊就要使用迴圈了,終止條件,以val的長度為基準。
var intToRoman = function(num) {
let val = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
let roman = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
let romNum = '';
let len = val.length;
for (let i = 0; i < len; i++) {
if (num >= val[i]) {
let count = parseInt(num / val[i]);
num = num % val[i];
romNum += roman[i].repeat(count);
}
}
return romNum;
};